package gxwl.common.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.base.MPJBaseMapper;
import com.github.yulichang.interfaces.MPJBaseJoin;
import com.github.yulichang.toolkit.Constant;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * Mybatis mapper加强接口，用于扩展 {@link MPJBaseMapper}<br>
 * 示例：
 * <pre>
 * public interface MyMapper extends MybatisBaseMapper&lt;MyEntity&gt; {}
 * </pre>
 * @author baijhc
 */
public interface MybatisBaseMapper<T> extends MPJBaseMapper<T> {

    /**
     * 批量插入
     * @param entityList 插入实体列表
     * @return 插入数量
     */
    int insertBatch(List<T> entityList);

    /**
     * 使用insert ignore批量插入，当主键或唯一键重复时不插入
     * @param entityList 插入实体列表
     * @return 插入数量
     */
    int insertIgnoreBatch(List<T> entityList);

    /**
     * 根据条件查询第一个数据
     * @param queryWrapper 查询条件
     * @return 第一个匹配的数据，没有则为null
     */
    default T selectFirst(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper) {
        Page<T> page = selectPage(Page.of(1, 1), queryWrapper);
        if (page.getTotal() > 0) {
            return page.getRecords().get(0);
        }
        return null;
    }

    /**
     * 根据条件查询第一个数据
     * @param clazz 查询结果类
     * @param wrapper 查询条件
     * @return 第一个匹配的数据，没有则为null
     */
    default T selectJoinFirst(@Param(Constant.CLAZZ) Class<T> clazz, @Param(Constants.WRAPPER) MPJBaseJoin<T> wrapper) {
        Page<T> page = selectJoinPage(Page.of(1, 1), clazz, wrapper);
        if (page.getTotal() > 0) {
            return page.getRecords().get(0);
        }
        return null;
    }

    /**
     * 清空表中的所有数据
     * @return 删除的数量
     */
    default int clear() {
        return delete(null);
    }

}

